package net.yakiboo.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import net.yakiboo.adrums.Song;

import android.content.Context;
import android.os.Environment;
import android.util.Log;

public class FileManager {

	/* Guarda en el fichero la cancion */
	public static void guardar(String fichero, Song cancion){
		String contenido="";
		for(int i=0; i<cancion.getSound().size();i++)
			contenido+=cancion.getSound().get(i) + " ";
		contenido+="\n";
		for(int i=0; i<cancion.getTime().size();i++)
			contenido+=cancion.getTime().get(i) + " ";
		
		Log.i("FileManager_Guardar", contenido);
		
		guardarSD(fichero, contenido);
	}
	
	/* Cargar la cancion del fichero */
	public static Song cargar(String fichero){
		String contenido=cargarSD(fichero);
		Log.i("FileManager_Cargar", contenido);
		Song cancion = new Song();
		try{
		
		String[] soundandtime = contenido.split("\n");
		String[] sounds = soundandtime[0].split(" ");
		String[] times = soundandtime[1].split(" ");
		
		for(int i=0; i<sounds.length;i++)
			cancion.getSound().add(Integer.parseInt(sounds[i]));
		for(int i=0; i<times.length;i++)
			cancion.getTime().add(Double.parseDouble(times[i]));
		}catch(ArrayIndexOutOfBoundsException e){
			Log.e("Carga", "Error al cargar la cancion: Cancion vacia o defectuosa");
		}
		
		return cancion;
	}
	
	public static String[] ls(){
		File dir = new File("mnt/sdcard/aDrums/");
		return dir.list();
	}
	
	
	
	/* Guarda en la memoria externa */
	public static void guardarSD(String fichero, String contenido) {
		/*
		 * Comprobamos el estado de la memoria externa (tarjeta SD).
		 * Si la memoria externa está disponible y se puede escribir.
		 */
		if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
			try {
				File ruta_sd = Environment.getExternalStorageDirectory();
				File ruta_adrums = new File(ruta_sd.getAbsolutePath(), "aDrums/");
				ruta_adrums.mkdir();
				File f = new File(ruta_adrums.getAbsolutePath(), fichero);

				OutputStreamWriter fout = new OutputStreamWriter(
						new FileOutputStream(f));

				fout.write(contenido);
				fout.close();
			} catch (Exception ex) {
				Log.e("Ficheros", "Error al escribir fichero a tarjeta SD");
			}
		} else {
			Log.e("Ficheros", "Tarjeta SD no disponible");
		}
	}

	/* Carga de la memoria externa */
	public static String cargarSD(String fichero) {
		String contenido = "";
		/*
		 * Comprobamos el estado de la memoria externa (tarjeta SD)
		 * Si la memoria externa está disponible y se puede leer al menos.
		 */
		if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
				|| Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED_READ_ONLY)) {
			try {
				File ruta_sd = Environment.getExternalStorageDirectory();

				File f = new File(ruta_sd.getAbsolutePath(),"aDrums/" + fichero);

				BufferedReader fin = new BufferedReader(new InputStreamReader(
						new FileInputStream(f)));
				
				String s;
				while ((s=fin.readLine())!=null)
					contenido += s + "\n";
				fin.close();
			} catch (Exception ex) {
				Log.e("Ficheros", "Error al leer fichero desde tarjeta SD");
				contenido=ex.toString();
			}
		} else {
			Log.e("Ficheros", "Tarjeta SD no disponible");
		}
		return contenido;
	}

	/* Guarda en la memoria interna.
	 * Requisito: Necesita la Activity actual (Context) */
	public static void guardarInterno(String fichero, String contenido, Context c) {
		try {
			OutputStreamWriter fout = new OutputStreamWriter(c.openFileOutput(
					fichero, Context.MODE_PRIVATE));

			fout.write(contenido);
			fout.close();
		} catch (Exception ex) {
			Log.e("Ficheros", "Error al escribir fichero a memoria interna");
		}
	}

	/* Carga de la memoria interna.
	 * Requisito: Necesita la Activity actual (Context) */
	public static String cargarInterno(String fichero, Context c) {
		String contenido = "";
		try {
			BufferedReader fin = new BufferedReader(new InputStreamReader(
					c.openFileInput(fichero)));

			String s;
			while ((s=fin.readLine())!=null)
				contenido += s + "\n";
			fin.close();
		} catch (Exception ex) {
			Log.e("Ficheros", "Error al leer fichero desde memoria interna");
		}

		return contenido;
	}
}
